// 链队列
#ifndef LINKED_QUEUE_H
#define LINKED_QUEUE_H

typedef char ElemType;

// 链队列的结点
typedef struct QNode
{
	ElemType data;
	struct QNode *next;
} QNode;

// 链队列对象结构体
typedef struct
{
	QNode *front; // 队头指针
	QNode *rear;  // 队尾指针
} LinkedQueue;

/**
 * 初始化一个链队列
 * @param queue 传入队列引用以初始化
 */
void initLinkedQueue(LinkedQueue &);

/**
 * 链队列是否为空
 * @param queue 传入队列引用
 * @return 队列是否为空
 */
int linkedQueueEmpty(LinkedQueue &);

/**
 * 返回链队列长度
 * @param queue 传入队列引用
 * @return 队列的长度
 */
int linkedQueueLength(LinkedQueue &);

/**
 * 查看队头元素
 * @param queue 传入队列引用
 * @return 队列队头元素
 */
ElemType getLinkedQueueHead(LinkedQueue &);

/**
 * 元素入队（从队尾）
 * @param queue 传入队列引用
 * @param e 入队的元素
 */
void enterLinkedQueue(LinkedQueue &, ElemType);

/**
 * 队头元素出队
 * @param queue 传入队列引用
 * @return 出队的元素
 */
ElemType goOutLinkedQueue(LinkedQueue &);

/**
 * 遍历队列中每个元素并传入visit函数调用
 * @param queue 传入队列引用
 * @param visit(ElemType&) 回调函数
 */
void linkedQueueTraverse(LinkedQueue &, void(ElemType &));

#include "./linked-queue.cpp"

#endif